package org.lanqiao.tjut.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.lanqiao.tjut.bean.TBStudentBean;
import org.lanqiao.tjut.db.DBFactory;
import org.lanqiao.tjut.myUtils.MyUtils;

public class StudentInfoModel {

	/**
	 * 根据Id主键参数（逻辑）删除学生信息
	 * 
	 * @param stuId
	 *            主键
	 * @return 删除操作结果
	 */
	public int deleteStudentInfoById(String stuId) {
		int re_i = 0;
		// 删除操作sql
		/*
		 * 逻辑删除：使用update修改标志位字段即可；
		 * 物理删除：使用delete语句进行删除操作即可；
		 * 注意：两种删除操作都要条件where，否则删除整张表的数据
		 */
		String sbSql = " update tbstudent set isdeleted=1 where stu_id=? ";
		// 查询sql参数集
		List<Object> lstParas = new ArrayList<>();
		lstParas.add(stuId);
		// 调用db层进行数据查询
		// 调用db层进行数据查询操作
		re_i = DBFactory.getDBDriverInstance().update(sbSql.toString(), lstParas.toArray());
		return re_i;
	}
	
	/**
	 * 根据Id主键参数查询学生信息
	 * 
	 * @param stuId
	 *            主键
	 * @return 查询结果实体对象
	 */
	public TBStudentBean getStudentInfoById(String stuId) {
		TBStudentBean stuB = null;
		// 查询sql
		String sbSql = "select * from TBSTUDENT where isdeleted=0 and stu_id=? ";
		// 查询sql参数集
		List<Object> lstParas = new ArrayList<>();
		lstParas.add(stuId);
		// 调用db层进行数据查询
		// 调用db层进行数据查询操作
		stuB = DBFactory.getDBDriverInstance().query(sbSql.toString(), 
				new BeanHandler<>(TBStudentBean.class),	lstParas.toArray());
		return stuB;
	}

	/**
	 * 根据参数查询学生信息
	 * 
	 * @param stuB
	 *            参数实体类
	 * @return 查询结果集
	 */
	public List<TBStudentBean> queryStudentInfoByParas(TBStudentBean stuB) {
		List<TBStudentBean> lstStus = null;
		// 查询sql
		// StringBuilder sbSql = new StringBuilder("select * from TBSTUDENT where 1=1 ");
		StringBuilder sbSql = new StringBuilder("select * from TBSTUDENT where isdeleted=0 ");
		// 查询sql参数集
		List<Object> lstParas = new ArrayList<>();
		// 根据查询参数实体类动态拼写查询条件
		if (stuB != null) {
			// 学生姓名 需要使用模糊查询
			String stuName = stuB.getStu_name();
			if (stuName != null && !stuName.equals("")) {
				// 拼写sql条件
				sbSql.append(" and stu_name like ?");
				// 添加参数
				lstParas.add("%" + stuName + "%");
			}

			// 学生性别查询
			String stuSex = stuB.getStu_sex();
			if (stuSex != null && !stuSex.equals("")) {
				// 拼写sql条件
				sbSql.append(" and stu_sex = ?");
				// 添加参数
				lstParas.add(stuSex);
			}

			// 学生出生日期开始时间
			Date stubirthday = stuB.getStu_birthday();
			if (stubirthday != null) {
				// 拼写sql条件
				sbSql.append(" and stu_birthday >= to_date(?,'yyyy-mm-dd hh24:mi:ss') ");
				// 添加参数
				lstParas.add(MyUtils.convertDate2String(stubirthday, "yyyy-MM-dd HH:mm:ss"));
			}

			// 学生出生日期截止时间
			Date stubirthday2 = stuB.getStu_birthday2();
			if (stubirthday2 != null) {
				// 拼写sql条件
				sbSql.append(" and stu_birthday <= to_date(?,'yyyy-mm-dd hh24:mi:ss') ");
				// 添加参数
				lstParas.add(MyUtils.convertDate2String(stubirthday2, "yyyy-MM-dd HH:mm:ss"));
			}

			// 学生系别查询
			Integer stuDepartment = stuB.getStu_department();
			if (stuDepartment != null) {
				// 拼写sql条件
				sbSql.append(" and stu_department = ?");
				// 添加参数
				lstParas.add(stuDepartment);
			}

			// TODO 其他的查询条件类推补充
		}
		// 主键字段倒序排序
		sbSql.append(" order by stu_id desc");
		// 调用db层进行数据查询操作
		lstStus = DBFactory.getDBDriverInstance().query(sbSql.toString(), 
				new BeanListHandler<>(TBStudentBean.class),	lstParas.toArray());
		// 返回查询结果集
		return lstStus;
	}

	/**
	 * 保存或修改学生信息
	 * 
	 * @param stuB
	 *            学生信息的表单数据
	 * @return 修改保存的结果集的记录条数
	 */
	public int saveOrUpdateStudentInfo(TBStudentBean stuB) {
		// 默认返回值
		int re_i = 0;
		// 数据库操作sql语句
		StringBuilder sbSql = new StringBuilder();
		// 数据库操作sql语句参数集合
		List<Object> lstParas = new ArrayList<>();
		// 根据主键字段是否为null来确定，数据库操作是新增还是修改
		if(stuB != null && stuB.getStu_id() == null){
			// 新增操作
			// 新增操作的sql语句
			sbSql.append("insert into tbstudent(stu_name,stu_sex,stu_birthday,stu_address,stu_tel,stu_img,stu_department) "
				+ "values(?,?,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?,?,?)");
			// 添加sql参数
			lstParas.add(stuB.getStu_name());
			lstParas.add(stuB.getStu_sex());
			lstParas.add(MyUtils.convertDate2String(stuB.getStu_birthday(), "yyyy-MM-dd HH:mm:ss"));
			lstParas.add(stuB.getStu_address());
			lstParas.add(stuB.getStu_tel());
			lstParas.add(stuB.getStu_img());
			lstParas.add(stuB.getStu_department());
		}else{
			// 修改操作
			/*
			 * 注意图片如果为null，则不进行修改
			 */
			// 修改操作的sql语句
			sbSql.append(" update tbstudent set stu_name=?,stu_sex=?,stu_birthday=to_date(?,'yyyy-mm-dd hh24:mi:ss'), "
					+ " stu_address=?,stu_tel=?,stu_department=? ");
			// 拼写sql参数
			// 添加sql参数
			lstParas.add(stuB.getStu_name());
			lstParas.add(stuB.getStu_sex());
			lstParas.add(MyUtils.convertDate2String(stuB.getStu_birthday(), "yyyy-MM-dd HH:mm:ss"));
			lstParas.add(stuB.getStu_address());
			lstParas.add(stuB.getStu_tel());
			lstParas.add(stuB.getStu_department());
			// 根据img是否为null，进行修改操作
			if (stuB.getStu_img() != null && !stuB.getStu_img().equals("")) {
				// img属性修改语句
				sbSql.append(" ,stu_img=? ");
				// 添加sql参数
				lstParas.add(stuB.getStu_img());
			}
			// 拼写where条件
			sbSql.append(" where stu_id=?");
			// 添加sql参数
			lstParas.add(stuB.getStu_id());
		}
		// 调用数据库层进行数据库保存处理
		re_i = DBFactory.getDBDriverInstance().update(sbSql.toString(), lstParas.toArray());
		return re_i;
	}
}
